package operaciones;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
//import java.text.DateFormat;
import java.util.Date;
//import java.util.Calendar;
//import java.util.TimeZone;
//import org.apache.commons.logging.Log; 
//import org.apache.commons.logging.LogFactory;  
//import org.apache.log4j.xml.DOMConfigurator; 

public class Operaciones {
	
	//Variables para la BD
	String sDriver = "com.mysql.jdbc.Driver";
	String sURL = "jdbc:mysql://localhost:3306/HORUS2";
	String user = "root";
	String pass = "jesus";
	Connection con = null;
    PreparedStatement stmt = null;
    
    // Trama recibida
    String trama;
	String[] datos; 
   
    //
	SimpleDateFormat sdf = new SimpleDateFormat("ss;mm;HH;dd;MM;yyyy");
	

	//Campos a insertar en la base e datos
	//Campos comunes a todas las tablas:
	//		2.- CREADO: String
	//		3.- FECHACREADO: String (fecha en formato: ”yyyy-MM-dd HH:mm:ss”)
	//		4.- MODIFICADO: String
	//		5.- FECHAMODIFICADO: String (fecha en formato: ”yyyy-MM-dd HH:mm:ss”)
	public String CREADO;
	String FECHACREADO;
	public String MODIFICADO;
	String FECHAMODIFICADO;
	//
		
	//Campos comunes a algunas tablas
	int EVENTO;
	

	//	SENSORPASO:
	//	1.- OBJE_X_SEIO: int
	//	6.- TIPO: int (1 ó 2)
	//	7.- EVENTO: int
	int OBJE_X_SEIO;
	int TIPO_SENSORPASO;
	//int EVENTO;
	
	//	RFID
	//	1.- OBJE_X_RFID: int
	//	6.- IDENTIFICADOR_ISO: int
	//	7.- TIPO: String
	//	8.- CODIGO_PAIS_ISO: int
	//	CODIGO_NO_ISO: int (*)
	//	9.- EVENTO: int
	int OBJE_X_RFID;
	int IDENTIFICADOR_ISO;
	String TIPO_RFID;
	int CODIGO_PAIS_ISO;
	//int EVENTO;	
	

	//	BALANZA
	//	1.- OBJE_X_BALA: int
	//	6.- TARA: float
	//	7.- VALOR: float
	//	8.- TIPOMEDIDA: int (0 o 1)
	//	9.- EVENTO: int
	int OBJE_X_BALA;
	float TARA;
	float VALOR;
	int TIPOMEDIDA;
	//int EVENTO;
	
	//	TEMPHUME
	//	1.- OBJE_X_TEHU: int
	//	6.- RHUMEDAD: float (%)
	//	7.- TEMPERATURA: float
	//	8.- TIPO_MEDIDA: “grados C” o “grados C/%RH”
	int OBJE_X_TEHU;
	float RHUMEDAD;
	float TEMPERATURA;
	String TIPO_MEDIDA;
	static String TIPO_MEDIDA_TEMP ="grados C";
	static String TIPO_MEDIDA_TEMPHUME = "grados C / %R H";
	
	public enum TipoInsercion
	{
	    TIPO_SENSORPASO,TIPO_RFID,TIPO_BALANZA,TIPO_TEMPHUME,TIPO_TEMP,TIPO_ERROR; 
	}
	
	
	public Operaciones(int port,String _sURL,String _user,String _pass){
		
		CREADO="Jesus";
		MODIFICADO="Jesus";
		OBJE_X_BALA = port;
		OBJE_X_RFID = port;
		OBJE_X_TEHU = port;
		OBJE_X_SEIO = port;
		
		sURL = _sURL;
		user = _user;
		pass = _pass;
		
		
		try {
			Class.forName(sDriver).newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			con = DriverManager.getConnection(sURL,user,pass);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
					
	}
	
	public void guardarEnBD(String tramarecibida,int port){
		
		trama=tramarecibida;
		datos = trama.split(";");
		
		//System.out.println("Insertar en BD la trama: "+trama);
		//System.out.println("Que procede del arduino: "+port);

		insertarEnBD(obtenerCampos());
						
	}
	
	public String obtenerCampos(){
		

		//System.out.println(datos[0]);
		//System.out.println(datos[1]);
		//System.out.println(Integer.parseInt(datos[1]));
		
		String tipo=null;
		
		//
		//if(datos[0]=="SET"){
			
			
			switch(Integer.parseInt(datos[1])){
			
		    case 1:
		    	
	    	
		    	obtenerCamposIR();
		    	
		    	tipo="TIPO_SENSORPASO"; 
	    	
		    	break;
		    	
		    case 2: 
  	
		    	obtenerCamposIR();
		    	
			    tipo="TIPO_SENSORPASO"; 
	    	
		    	break;
		    	
		    case 3: 
		    	
		    	obtenerCamposRFID();
		    	
			    tipo="TIPO_RFID"; 
		    	
		    	break;
		    	
		    case 4: 
		    	
		    	obtenerCamposBalanza();
			    tipo="TIPO_BALANZA"; 
		    	
		    	break;
		    	
		    case 5:
		    	obtenerCamposTemperaturaHumedad();
			    tipo="TIPO_TEMPHUME"; 
		    	
		    	break;
		    	
		    case 6: 
		    	
		    	obtenerCamposTemperatura();
			    tipo="TIPO_TEMP"; 
		    	    	
		    	break;
		    	
		    default:
		    	
				tipo="TIPO_ERROR";	
		    	System.out.println("Trama incorrecta");
		    	break;
		    						
			}
					
		//}
		//
		
		return tipo;
	}
	
	public void obtenerCamposIR(){
		
		//FECHACREADO="FECHA QUE APARECE EN LA TRAMA";
		//FECHAMODIFICADO="FECHA QUE APARECE EN LA TRAMA";
		
		//SET;1;EVENTO;FECHA
		//SET;2;EVENTO;FECHA
		
		//int TIPO_SENSORPASO;
		//int EVENTO;
		
		Date dt = null;
			
		if(datos[1].equals("1")){
			
			// Sensor de paso IR 1
			// datos[2]: evento
			
			try {
				dt=sdf.parse(datos[3]+";"+datos[4]+";"+datos[5]+";"+datos[6]+";"+datos[7]+";"+datos[8]);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			TIPO_SENSORPASO=Integer.parseInt(datos[1]);
			EVENTO=Integer.parseInt(datos[2]);
			FECHACREADO=obtenerFecha(dt);
			FECHAMODIFICADO=obtenerFecha(dt);
			
			//System.out.println(datos[3]+";"+datos[4]+";"+datos[5]+";"+datos[6]+";"+datos[7]+";"+datos[8]);
			//System.out.println(dt);
			//System.out.println(FECHACREADO);
						
			
		}else if(datos[1].equals("2")){
			
			// Sensor de paso IR 2
			// datos[2]: evento
			
			try {
				dt=sdf.parse(datos[3]+";"+datos[4]+";"+datos[5]+";"+datos[6]+";"+datos[7]+";"+datos[8]);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			TIPO_SENSORPASO=Integer.parseInt(datos[1]);
			EVENTO=Integer.parseInt(datos[2]);
			FECHACREADO=obtenerFecha(dt);
			FECHAMODIFICADO=obtenerFecha(dt);
			
			//System.out.println(datos[3]+";"+datos[4]+";"+datos[5]+";"+datos[6]+";"+datos[7]+";"+datos[8]);
			//System.out.println(dt);
			//System.out.println(FECHACREADO);
			
		}
		
	}
	
	public void obtenerCamposRFID(){
		
	
		//FECHACREADO="FECHA QUE APARECE EN LA TRAMA";
		//FECHAMODIFICADO="FECHA QUE APARECE EN LA TRAMA";
		
		//SET;3;EVENTO;TIPO_RFID;IDENTIFICADOR_ISO;CODIGO_PAIS;FECHA
		
		//int EVENTO;	
		//String TIPO_RFID;
		//int IDENTIFICADOR_ISO;
		//int CODIGO_PAIS_ISO;
		
		Date dt = null;
		
		
		//System.out.println("Probando la fecha");
		//System.out.println(datos[6]+";"+datos[7]+";"+datos[8]+";"+datos[9]+";"+datos[10]+";"+datos[10]);
		
		
		if(datos[1].equals("3")){
	
			try {
				dt=sdf.parse(datos[6]+";"+datos[7]+";"+datos[8]+";"+datos[9]+";"+datos[10]+";"+datos[11]);


			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			EVENTO=Integer.parseInt(datos[2]);
			TIPO_RFID=datos[3];
			IDENTIFICADOR_ISO=Integer.parseInt(datos[4]);
			CODIGO_PAIS_ISO=Integer.parseInt(datos[5]);
			FECHACREADO=obtenerFecha(dt);
			FECHAMODIFICADO=obtenerFecha(dt);
			
			//System.out.println(datos[6]+";"+datos[7]+";"+datos[8]+";"+datos[9]+";"+datos[10]+";"+datos[11]);
			//System.out.println(dt);
			//System.out.println(FECHACREADO);
					
		}

		
	}
	
	public void obtenerCamposBalanza(){
	
		//FECHACREADO="FECHA QUE APARECE EN LA TRAMA";
		//FECHAMODIFICADO="FECHA QUE APARECE EN LA TRAMA";
		
		//SET;4;EVENTO;VALOR;TIPO_MEDIDA;TARA;FECHA
		
		//int EVENTO;
		//float VALOR;
		//int TIPOMEDIDA;
		//float TARA;
		
		Date dt = null;
		
		if(datos[1].equals("4")){
			
			try {
				dt=sdf.parse(datos[6]+";"+datos[7]+";"+datos[8]+";"+datos[9]+";"+datos[10]+";"+datos[11]);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			EVENTO=Integer.parseInt(datos[2]);
			VALOR=Float.parseFloat(datos[3]);
			TIPOMEDIDA=Integer.parseInt(datos[4]);
			TARA=Float.parseFloat(datos[5]);

			FECHACREADO=obtenerFecha(dt);
			FECHAMODIFICADO=obtenerFecha(dt);
			
			//System.out.println(datos[6]+";"+datos[7]+";"+datos[8]+";"+datos[9]+";"+datos[10]+";"+datos[11]);
			//System.out.println(dt);
			//System.out.println(FECHACREADO);
					
		}
		
	}
	
	public void obtenerCamposTemperaturaHumedad(){
		
		//FECHACREADO="FECHA QUE APARECE EN LA TRAMA";
		//FECHAMODIFICADO="FECHA QUE APARECE EN LA TRAMA";
		
		//SET;5;TEMPERATURA;HUMEDAD;FECHA
		
		//int OBJE_X_TEHU;
		//float RHUMEDAD;
		//float TEMPERATURA;
		//String TIPO_MEDIDA="grados C / % RH";
		
		Date dt = null;
		
		if(datos[1].equals("5")){
			
			try {
				dt=sdf.parse(datos[4]+";"+datos[5]+";"+datos[6]+";"+datos[7]+";"+datos[8]+";"+datos[9]);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			TEMPERATURA=Float.parseFloat(datos[2]);
			RHUMEDAD=Float.parseFloat(datos[3]);
			TIPO_MEDIDA=TIPO_MEDIDA_TEMPHUME;
			FECHACREADO=obtenerFecha(dt);
			FECHAMODIFICADO=obtenerFecha(dt);
			
			//System.out.println(datos[4]+";"+datos[5]+";"+datos[6]+";"+datos[7]+";"+datos[8]+";"+datos[9]);
			//System.out.println(dt);
			//System.out.println(FECHACREADO);
					
		}
		
	}
	
	
	public void obtenerCamposTemperatura(){
		
		//FECHACREADO="FECHA QUE APARECE EN LA TRAMA";
		//FECHAMODIFICADO="FECHA QUE APARECE EN LA TRAMA";
		
		//SET;6;TEMPERATURA;DIRECCION;FECHA

		//float TEMPERATURA;
		//float RHUMEDAD=null;
		//String TIPO_MEDIDA="grados C";
		
		Date dt = null;
		
		if(datos[1].equals("6")){
			
			try {
				dt=sdf.parse(datos[4]+";"+datos[5]+";"+datos[6]+";"+datos[7]+";"+datos[8]+";"+datos[9]);
				
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			TEMPERATURA=Float.parseFloat(datos[2]);
			//RHUMEDAD=null;
			TIPO_MEDIDA=TIPO_MEDIDA_TEMP;
			FECHACREADO=obtenerFecha(dt);
			FECHAMODIFICADO=obtenerFecha(dt);
			
			//System.out.println(datos[4]+";"+datos[5]+";"+datos[6]+";"+datos[7]+";"+datos[8]+";"+datos[9]);
			//System.out.println(dt);
			//System.out.println(FECHACREADO);
					
		}
		
	}

	////
	
	
	public void insertarEnBD(String tipo){
		
		
		switch (TipoInsercion.valueOf(tipo))
		{
		    case TIPO_RFID:   
				//2.- RFID
				
				
				try {
					stmt=con.prepareStatement("INSERT INTO RFID (OBJE_X_RFID,CREADO,FECHACREADO,MODIFICADO,FECHAMODIFICADO,IDENTIFICADOR_ISO,TIPO,CODIGO_PAIS_ISO,EVENTO) VALUES(?,?,?,?,?,?,?,?,?)");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				
			    try {
					stmt.setInt(1,OBJE_X_RFID);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(2,CREADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(3,FECHACREADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(4,MODIFICADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(5,FECHAMODIFICADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setInt(6,IDENTIFICADOR_ISO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(7,TIPO_RFID);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setInt(8,CODIGO_PAIS_ISO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setInt(9,EVENTO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				
				try {
					
					//retorno = 
					stmt.executeUpdate();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
						      
				//System.out.println(retorno);  
				//
		    	
		    	
		    	
		    	break;
		    case TIPO_BALANZA:
		    	
				//4.- BALANZA
				
				
				try {
					stmt=con.prepareStatement("INSERT INTO BALANZA (OBJE_X_BALA,CREADO,FECHACREADO,MODIFICADO,FECHAMODIFICADO,TARA,VALOR,TIPOMEDIDA,EVENTO) VALUES(?,?,?,?,?,?,?,?,?)");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				
			    try {
					stmt.setInt(1,OBJE_X_BALA);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(2,CREADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(3,FECHACREADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(4,MODIFICADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(5,FECHAMODIFICADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setFloat(6,TARA);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setFloat(7,VALOR);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setInt(8,TIPOMEDIDA);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setInt(9,EVENTO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				
				try {
					
					//retorno = 
					stmt.executeUpdate();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		    	
		    	
		    	
		    	
		        break;
		    case TIPO_TEMPHUME:
		    	
		    					
				//3.- TEMPHU
				
				
				try {
					stmt=con.prepareStatement("INSERT INTO TEMPHUME (OBJE_X_TEHU,CREADO,FECHACREADO,MODIFICADO,FECHAMODIFICADO,RHUMEDAD,TEMPERATURA,TIPO_MEDIDA) VALUES(?,?,?,?,?,?,?,?)");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				
			    try {
					stmt.setInt(1,OBJE_X_TEHU);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(2,CREADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(3,FECHACREADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(4,MODIFICADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(5,FECHAMODIFICADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setFloat(6,RHUMEDAD);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setFloat(7,TEMPERATURA);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(8,TIPO_MEDIDA);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				
				try {
					
					//retorno = 
					stmt.executeUpdate();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
						      
				//System.out.println(retorno);  

				
				
				//
		    	
		    	
		        break;
		        
		    case TIPO_TEMP:
		    	
				
				//3.- TEMPHU
				
				
				try {
					stmt=con.prepareStatement("INSERT INTO TEMPHUME (OBJE_X_TEHU,CREADO,FECHACREADO,MODIFICADO,FECHAMODIFICADO,TEMPERATURA,TIPO_MEDIDA) VALUES(?,?,?,?,?,?,?)");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				
			    try {
					stmt.setInt(1,OBJE_X_TEHU);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(2,CREADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(3,FECHACREADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(4,MODIFICADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(5,FECHAMODIFICADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setFloat(6,TEMPERATURA);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(7,TIPO_MEDIDA);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				
				try {
					
					//retorno = 
					stmt.executeUpdate();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
						      
				//System.out.println(retorno);  

				
				
				//
		    	
		    	
		        break;
		        
		        
		    case TIPO_SENSORPASO:
		    	
				//1.- SENSORPASO
				
				
				try {
					stmt=con.prepareStatement("INSERT INTO SENSORPASO (OBJE_X_SEIO,CREADO,FECHACREADO,MODIFICADO,FECHAMODIFICADO,TIPO,EVENTO) VALUES(?,?,?,?,?,?,?)");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				
			    try {
					stmt.setInt(1,OBJE_X_SEIO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(2,CREADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(3,FECHACREADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(4,MODIFICADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setString(5,FECHAMODIFICADO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setInt(6,TIPO_SENSORPASO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					stmt.setInt(7,EVENTO);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				
				try {
					
					//retorno = 
					stmt.executeUpdate();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
						      
				//System.out.println(retorno); 
		    	
		    	
		        break;
		    default:
		        // ERROR
		        break;
		}
		
	}
	
	
	
    public String obtenerFecha(Date fechaDate)    {
    	 
    	SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
    	//System.out.println(fechaDate);
    	
        String fechaString = new String( sdf2.format( fechaDate ) );
        
        //System.out.println(fechaString);
        
        return fechaString;
        
        
    }
   
	 
	

}
